package creational_pattern.singleton;

/**
 * 懒汉模式
 *      双重检查锁方式
 */

public class Singleton4 {

    // 1. 私有化构造方法
    private Singleton4() {}

    // 2. 类内声明对象
    private static volatile Singleton4 instance;

    // 3. 提供对外的方法
    /*
    * 双重检查锁存在的问题：
    *   多线程情况下，可能出现空指针
    *   原因：JVM在实例化对象时会进行优化和指令重排序
    *   解决：使用volatile
    * */
    public static Singleton4 getInstance2() {
        // 第一次判断，判断是否已经创建过
        // 如果不为null，不需要抢占所，直接返回
        if(instance == null) {
           synchronized (Singleton4.class) {
               // 第二次判断
               if(instance == null) {
                   instance = new Singleton4();
               }
           }
        }
        return instance;
    }
}
